#include <stdio.h>
#include <stdlib.h>
#include "coro.h"

#define N 8

coro_t *coro_p;
coro_t *coro_f;
coro_t *coro_c;

void produce()
{
	int i;
	for (i = 0; i < N; ++i) {
		printf("produce %d\n", i);
		coro_yield(i);
	}
}

void filter()
{
	int i, x;
	for (i = 0; i < N; ++i) {
		x = coro_resume(coro_p) * 10;
		printf("	filter %d -> %d\n", i, x);
		coro_yield(x);		
	}
}

void consume()
{
	int i, x;
	for (i = 0; i < N; ++i) {
		x = coro_resume(coro_f);
		printf("		consume %d\n", x);
	}
	printf("		END\n");
	exit(0);
}

int main()
{
	puts("                CONSUME\n");
	puts("        FILTER\n");
	puts("PRODUCE\n");	
	coro_p = coro_new(produce);
	coro_f = coro_new(filter);
	coro_c = coro_new(consume);
	coro_boot(coro_c);
	coro_delete(coro_p);
	coro_delete(coro_f);
	coro_delete(coro_c);
    	return 0;
}
